<?php
if (!class_exists('ItemProp', false)) {
    class ItemProp
    {
        /**
         * 获取子分类列表
         *
         * @param  int  $cid
         * @return array
         */
        public static function childCats($cid)
        {
            if ($cid == '0') {
                return DB::select()
                    ->from('item_cats')
                    ->where('is_parent=0')
                    ->order('cid ASC')
                    ->fetchAll();
            }

            $cats = array();
            if (preg_match('/^\d+,?$/', $cid)) {
                $cids = explode(',', $cid);
                foreach ($cids as $id) {
                    $cat = DB::select()
                        ->from('item_cats')
                        ->where('cid=?', $id)
                        ->fetchRow();
                    if ($cat) {
                        $rows = DB::select()
                            ->from('item_cats')
                            ->where('cat_path LIKE ?', $cat['cat_path'].'%')
                            ->where('is_parent=0')
                            ->order('cid ASC')
                            ->fetchAll();
                        $cats = array_merge($cats, $rows);
                    }
                }
            }

            return $cats;
        }

        /**
         * 获取远程数据错误信息
         *
         * @param  array  $data
         * @return string
         */
        public static function remoteException($data, $func = null, $suffix = null)
        {
            if (isset($data['error_response'])) {

                $error = $data['error_response'];

                $msg = isset($error['sub_msg']) ? $error['sub_msg'] : (isset($error['msg']) ? $error['msg'] : '未知错误');
                $code = isset($error['code']) ? $error['code'] : 0;

                throw new Api_Exception($msg, $code, $func, $suffix);
            }
        }

        /**
         * 获取远程属性数据
         *
         * @param  int  $cid
         * @return array
         */
        public static function remoteProps($cid, $parent_pid = 0)
        {
            $api = new Taoapi();
            $api->method = 'taobao.itemprops.get';
            $api->fields = 'pid,parent_pid,parent_vid,name,is_color_prop,is_enum_prop,is_input_prop,'.
                           'is_item_prop,is_key_prop,is_sale_prop,multi,must,sort_order,status,'.
                           'is_allow_alias,child_template';
            $api->cid = $cid;
            $api->parent_pid = $parent_pid;

            $errorSuffix = "类目ID：{$cid}";

            for ($i = 1; $i < 10; $i++) {
                $data = $api->send('get','json')->getArrayData();
                try {
                    self::remoteException($data, __FUNCTION__, $errorSuffix);
                    if (isset($data['itemprops_get_response'])) {
                        return $data['itemprops_get_response'];
                    }
                    CLI::output('.');
                    throw new Api_Exception("第 $i 次获取类目属性数据失败", 0, __FUNCTION__, $errorSuffix);
                } catch (Api_Exception $e) {
                    $e->code() && CLI::output('!');
                    sleep(10); // 休息10 秒钟
                }
            }
        }

        /**
         * 保存属性数据
         *
         * @param  array  $prop
         */
        public static function saveProp($cid, array $prop, $suffix = '')
        {
            if (isset($prop['status']) && $prop['status'] != 'normal') {
                return;
            }

            CLI::output("\n{$suffix}".trim($prop['name'])."：");

            // 属性表
            $data = array(
                'pid' => $prop['pid'],
                'parent_pid' => $prop['parent_pid'],
                'parent_vid' => $prop['parent_vid'],
                'name' => $prop['name'],
            );
            DB::replace('item_props', $data);
            CLI::output(">");

            // 类目属性表
            $data = array(
                'pid' => $prop['pid'],
                'cid' => $cid,
                'name_alias' => $prop['name'],
                'is_color_prop' => $prop['is_color_prop'],
                'is_enum_prop' => $prop['is_enum_prop'],
                'is_input_prop' => $prop['is_input_prop'],
                'is_item_prop' => $prop['is_item_prop'],
                'is_key_prop' => $prop['is_key_prop'],
                'is_sale_prop' => $prop['is_sale_prop'],
                'multi' => $prop['multi'],
                'must' => $prop['must'],
                'sort_order' => $prop['sort_order'],
            );
            isset($prop['child_template']) && $data['child_template'] = $prop['child_template'];
            DB::replace('item_cat_props', $data);
            CLI::output(">");

            // 属性值
            $values = ItemProp::remotePropValues($cid, $prop['pid']);
            if (isset($values['prop_values']['prop_value'])) {
                foreach ($values['prop_values']['prop_value'] as $value) {
                    if (isset($value['status']) && $value['status'] != 'normal') {
                        continue;
                    }

                    // 属性值数据
                    $data = array(
                        'vid' => $value['vid'],
                        'name' => $value['name'],
                    );
                    isset($value['is_parent']) && $data['is_parent'] = $value['is_parent'];
                    DB::replace('item_prop_values', $data);

                    // 类目属性值数据
                    $data = array(
                        'cid' => $cid,
                        'pid' => $value['pid'],
                        'vid' => $value['vid'],
                        'name_alias' => $value['name_alias'],
                        'sort_order' => $value['sort_order'],
                    );
                    DB::replace('item_cat_values', $data);
                }
            }
            CLI::output(">");

            // 获取子属性
            $props = ItemProp::remoteProps($cid, $prop['pid']);
            if (isset($props['item_props']['item_prop'])) {
                foreach ($props['item_props']['item_prop'] as $p) {
                    ItemProp::saveProp($cid, $p, $suffix.'    ');
                }
            }
        }

        /**
         * 获取远程属性值数据
         *
         * @param  int  $cid
         * @return array
         */
        public static function remotePropValues($cid, $pid)
        {
            $api = new Taoapi();
            $api->method = 'taobao.itempropvalues.get';
            $api->fields = 'cid,pid,vid,prop_name,name,name_alias,is_parent,sort_order,status';
            $api->cid = $cid;
            $api->pvs = $pid;

            $errorSuffix = "类目ID：{$cid}，属性ID：$pid";

            for ($i = 1; $i < 10; $i++) {
                $data = $api->send('get','json')->getArrayData();
                try {
                    self::remoteException($data, __FUNCTION__, $errorSuffix);
                    if (isset($data['itempropvalues_get_response'])) {
                        return $data['itempropvalues_get_response'];
                    }
                    CLI::output('.');
                    throw new Api_Exception("第 $i 次获取类目属性数据失败", 0, __FUNCTION__, $errorSuffix);
                } catch (Api_Exception $e) {
                    $e->code() && CLI::output('!');
                    sleep(10); // 休息10 秒钟
                }
            }
        }

        /**
         * 判断分类下载是否锁定
         *
         * @param  int  $cid
         * @return bool
         */
        public static function locked($cid)
        {
            return is_file(TMPPATH."/logs/lock/props/$cid.lock");
        }

        /**
         * 锁定分类下载
         *
         * @param  int  $cid
         * @param  int  $total
         */
        public static function lock($cid, $total = 0)
        {
            $file = TMPPATH."/logs/lock/props/$cid.lock";
            file_put_contents($file, $total);
        }
    }
}


/**
 * 下载类目属性数据
 *
 * @author Akon(番茄红了) <aultoale@gmail.com>
 */
$propsMenu = <<<EOF

---------------------------

 1、清除类目属性数据

 2、下载类目属性数据

 0、返回

---------------------------

请选择 (0,1,2)：
EOF;

do {
    // 显示菜单
    $input = CLI::input($propsMenu);

    // 清除类目属性数据
    if ($input == 1) {

        break;

        $input = CLI::input("\n请输入所属的类目ID，输入“0”将删除所有类目（多个类目请使用逗号分隔）：");

        CLI::output("\n信息：尚未开发完成！\n");

    // 下载类目属性数据
    } elseif ($input == 2) {

        break;

        $input = CLI::input("\n请输入所属的类目ID（多个类目请使用逗号分隔）：");

        if ($input == '') { continue; }

        CLI::output("\n正在获取类目信息...");
        $cats = ItemProp::childCats($input);
        CLI::output("(共 ".count($cats)." 个类目)\n");

        CLI::output("\n\n所有类目属性下载完成 √\n");

    // 返回
    } else {
        break;
    }

    CLI::input("\n请按下回车键继续！");

} while (true);

unset($propsMenu);